/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package evabot.bot;

//package alicebot.bot;

import java.io.FileNotFoundException;
import java.io.IOException;

import javax.xml.parsers.ParserConfigurationException;

import org.xml.sax.SAXException;

import evabot.xml.AIMLController;
import bitoflife.chatterbean.AliceBot;
import bitoflife.chatterbean.parser.AliceBotParserConfigurationException;
import bitoflife.chatterbean.parser.AliceBotParserException;

/**
 * Classe responsavel pelo controle do Chatterbot.
 *
 * @author Alexandre Sales, Danielle Chaves, Maria Isabel Farias
 *
 */
public class EvaBotController {

	public EvaBotMother mother;
	public AliceBot alice;
	public EvaBotLog log;
	public String defaultResponse = "";
	private AIMLController domController;
	private String lastResponse = "";
	private String aimlPersonal = "";
	private static EvaBotController instance = null;

	/**
	 * Criacao de uma nova controladora do Bot.
	 *
	 */
	private EvaBotController(String contextFile,String splitterFile,String substitutions,String parentDirectory,String aimlFiles, String aimlPersonal) throws FileNotFoundException, AliceBotParserConfigurationException, AliceBotParserException, IOException {
		mother = new EvaBotMother(contextFile,splitterFile,substitutions,parentDirectory,aimlFiles);
		this.alice = mother.newInstance();
		this.log = EvaBotLog.getInstance();
		this.domController = AIMLController.getInstance();
		this.aimlPersonal = aimlPersonal;
	}

	/**
	 * CriaÃ§Ã£o de uma nova instÃ¢ncia da controladora do Bot.
	 *
	 * @param contextFile
	 * 			LocalizaÃ§Ã£o do context.xml.
	 * @param splitterFile
	 * 			LocalizaÃ§Ã£o do splitters.xml.
	 * @param substitutions
	 * 			LocalizaÃ§Ã£o do substitutions.xml.
	 * @param parentDirectory
	 * 			LocalizaÃ§Ã£o da raÃ­z da Base de Conhecimento do Bot.
	 * @param aimlFiles
	 * 			LocalizaÃ§Ã£o do diretÃ³rio onde se encontra os arquivos AIML.
	 * @param aimlPersonal
	 * 			Nome do arquivo AIML pessoal do usuÃ¡rio corrente.
	 *
	 * @return Uma nova instÃ¢ncia da controladora do Bot.
	 *
	 * @throws FileNotFoundException
	 * 			Caso o arquivo nÃ£o exista.
	 * @throws AliceBotParserConfigurationException
	 * 			Caso haja algum arquivo de configuraÃ§Ã£o errado.
	 * @throws AliceBotParserException
	 * 			Caso haja algum diretÃ³rio de configuraÃ§Ã£o invÃ¡lido.
	 * @throws IOException
	 * 			Erro de entrada/saida.
	 */
	public static EvaBotController getInstance(String contextFile,String splitterFile,String substitutions,String parentDirectory,String aimlFiles, String aimlPersonal) throws FileNotFoundException, AliceBotParserConfigurationException, AliceBotParserException, IOException {
		if(instance == null) {
			return new EvaBotController(contextFile,splitterFile,substitutions,parentDirectory,aimlFiles, aimlPersonal);
		}
		return instance;
	}

	/**
	 * Seta a resposta padrÃ£o do Bot, quando nÃ£o houver conhecimento suficiente
	 * na Base de Conhecimento.
	 *
	 * @param defaultResponse
	 * 			Resposta PadrÃ£o.
	 */
	public void setDefaultResponse(String defaultResponse) {
		this.defaultResponse = defaultResponse;
	}

	/**
	 * Recupera a resposta padrÃ£o do Bot.
	 *
	 * @return A resposta padrÃ£o do Bot.
	 */
	public String getDefaultResponse() {
		return this.defaultResponse;
	}

	/**
	 * Recupera, na Base de Conhecimento, a resposta do Bot a uma determinada
	 * pergunta feita pelo usuÃ¡rio.
	 *
	 * @param question
	 * 			A pergunta.
	 *
	 * @return A resposta do Bot.
	 *
	 * @throws IOException
	 * 			Erro de entrada/saida.
	 * @throws SAXException
	 * 			Caso haja algum erro ou aviso SAX.
	 * @throws ParserConfigurationException
	 * 			Caso haja algum erro na configuraÃ§Ã£o do Parser do Chatterbean.
	 */
	public String respond(String question) throws ParserConfigurationException, SAXException, IOException {
		log.saveLog("UsuÃ¡rio: "+question);

		String response = alice.respond(question);

		if (response.equalsIgnoreCase(getDefaultResponse())) {
			lastResponse = response;
		}
		if (lastResponse.equalsIgnoreCase(getDefaultResponse())
				&& question.contains("aprenda")) {
			domController.setNewCategory(aimlPersonal,question, response);
		}

		log.saveLog("Eva: "+response);
		return response;
	}

	/**
	 * Recupera o Bot.
	 *
	 * @return o ChatterBot.
	 */
	public AliceBot getBot() {
		return this.alice;
	}

	/**
	 * Inicia o log do diÃ¡logo.
	 *
	 * @param isLogging
	 * 			true, caso queira iniciar o Log.
	 * 			false, caso contrÃ¡rio.
	 */
	public void setLog(boolean isLogging) {
		log.setLog(isLogging);
	}

	/**
	 * Verifica se o diÃ¡logo estÃ¡ sendo ou nÃ£o gravado.
	 *
	 * @return  Retorna true, caso verdadeiro.
	 * 			Retorna false, caso contrÃ¡rio.
	 */
	public boolean isLogging() {
		return log.isLogging();
	}

}